home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
PARI
/
PARI2
/
pari
/
c
/
mp
< prev
next >
Wrap
Text File
|
1991-12-14
|
36KB
|
1,884 lines
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~ ~*/
/*~ OPERATIONS DE BASE (NOYAU) ~*/
/*~ ~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
# include "genpari.h"
GEN mulsi(x,y)
long x;
GEN y;
{
long s=signe(y),ly=lgef(y),i;
GEN z;
if((!x)||(!s)) return gzero;
if(x<0) {s= -s;x= -x;}
z=cgeti(ly+1);hiremainder=0;
for(i=ly-1;i>=2;i--) z[i+1]=addmul(x,y[i]);
if(hiremainder) {z[2]=hiremainder;setlgef(z,ly+1);}
else {avma+=4;z[1]=z[0]-1;z++;setlgef(z,ly);}
setsigne(z,s);return z;
}
GEN stoi(x)
long x;
{
GEN y;
if(!x) return gzero;
y=cgeti(3);
if(x>0) {y[1]=0x1000003;y[2]=x;}
else{y[1]=0xff000003;y[2]= -x;}
return y;
}
GEN cgetg(x,y)
long x,y;
{
unsigned long p1;
GEN z;
p1=avma-(((unsigned short)x)<<2);
while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
avma=p1;z=(GEN)p1;z[0]=0x10000+x+(y<<24);
return z;
}
GEN cgeti(x)
long x;
{
unsigned long p1;
GEN z;
p1=avma-(((unsigned short)x)<<2);
while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
avma=p1;z=(GEN)p1;z[0]=0x1010000+x;
return z;
}
GEN cgetr(x)
long x;
{
unsigned long p1;
GEN z;
p1=avma-(((unsigned short)x)<<2);
while(p1<bot) {allocatemoremem();p1=avma-(((unsigned short)x)<<2);}
avma=p1;z=(GEN)p1;z[0]=0x2010000+x;
return z;
}
GEN icopy(x)
GEN x;
{
GEN y;
long lx=lgef(x),i;
y=cgeti(lx);
for(i=1;i<lx;i++) y[i]=x[i];
return y;
}
GEN rcopy(x)
GEN x;
{
GEN y;
long lx=lg(x),i;
y=cgetr(lx);
for(i=1;i<lx;i++) y[i]=x[i];
return y;
}
GEN negi(x)
GEN x;
{
long s=signe(x);
GEN y;
if(!s) return gzero;
y=icopy(x);setsigne(y,-s);
return y;
}
GEN negr(x)
GEN x;
{
GEN y;
y=rcopy(x);setsigne(y,-signe(x));
return y;
}
GEN absi(x)
GEN x;
{
GEN y;
long s=signe(x);
if(!s) return gzero;
y=icopy(x);setsigne(y,1);return y;
}
GEN absr(x)
GEN x;
{
GEN y;
long s=signe(x);
y=rcopy(x);
if(s) setsigne(y,1);
return y;
}
int expi(x)
GEN x;
{
long lx=x[1]&0xffff;
return lx==2 ? -8388608 : ((lx-2)<<5)-bfffo(x[2])-1;
}
long itos(x)
GEN x;
{
long s=signe(x),p2;
unsigned long p1;
if(!s) return 0;
if(lgef(x)>3) err(affer2);
p1=x[2];if(p1>=0x80000000) err(affer2);
p2=(s>0)?p1:(-((long)p1));return p2;
}
void mpaff(x,y)
GEN x,y;
{
long tx=typ(x),ty=typ(y);
if(tx==1)
{
if(ty==1) affii(x,y);else affir(x,y);
}
else
{
if(ty==1) affri(x,y);else affrr(x,y);
}
}
void affsi(s,x)
long s;
GEN x;
{
long lx;
if(!s) {x[1]=2;return;}
lx=lg(x);if(lx<3) err(affer1);
if(s>0) {x[1]=0x1000003;x[2]=s;}
else {x[1]=0xff000003;x[2]= -s;}
}
void affsr(s,x)
long s;
GEN x;
{
long l,i,d;
if(!s)
{
l=((x[0]&0xffff)-2)<<5;x[1]=0x800000-l;x[2]=0;
}
else
{
d=1;if(s<0) {d= -1;s= -s;}
l=bfffo(s);setexpo(x,31-l);setsigne(x,d);
x[2]=(s<<l);for(i=3;i<lg(x);i++) x[i]=0;
}
}
void affii(x,y)
GEN x,y;
{
long lx=lgef(x),i;
if(x==y) return;
if(lg(y)<lx) err(affer3);
for(i=1;i<lx;i++) y[i]=x[i];
}
void affir(x,y)
GEN x,y;
{
long lx=lgef(x),ly=lg(y),s,i,l,k;
s=signe(x);
if(!s)
{
y[1]=0x800000-((ly-2)<<5);y[2]=0;
}
else
{
setsigne(y,s);l=((x[1]&0xffff)-2)<<5;s=bfffo(x[2]);
if(s)
{
setexpo(y,l-s-1);
if(lx<=ly)
{
for(i=lx;i<ly;i++) y[i]=0;k=0;
for(i=lx-1;i>=2;i--) {y[i]=shiftl(x[i],s)+k;k=hiremainder;}
}
else
{
shiftl(x[ly],s);k=hiremainder;
for(i=ly-1;i>=2;i--) {y[i]=shiftl(x[i],s)+k;k=hiremainder;}
}
}
else
{
setexpo(y,l-1);
if(lx<=ly)
{
for(i=lx;i<ly;i++) y[i]=0;
for(i=lx-1;i>=2;i--) y[i]=x[i];
}
else for(i=ly-1;i>=2;i--) y[i]=x[i];
}
}
}
void affrr(x,y)
GEN x,y;
{
long lx=lg(x),ly=lg(y),i;
if(x==y) return;
y[1]=x[1];
if(!(x[1]&0xff000000)) y[2]=0;
else
{
if(lx<=ly)
{
for(i=2;i<lx;i++) y[i]=x[i];
for(i=lx;i<ly;i++) y[i]=0;
}
else for(i=2;i<ly;i++) y[i]=x[i];
}
}
GEN shifts(x,y)
long x,y;
{
long t[3];
if(!x) return gzero;
t[0]=0x1010003;
if(x>0) {t[1]=0x1000003;t[2]=x;}
else {t[1]=0xff000003;t[2]= -x;}
return shifti(t,y);
}
GEN shifti(x,n)
GEN x;
long n;
{
long lx=lgef(x),i,s=signe(x),d,m,p1,p2,k;
GEN y;
if(!s) return gzero;
if(!n) return icopy(x);
if(n>0)
{
d=n>>5;m=n&31;
if(m)
{
p1=shiftl(x[2],m);p2=hiremainder;k=0;
if(p2)
{
y=cgeti(lx+d+1);for(i=lx+1;i<=lx+d;i++) y[i]=0;
for(i=lx;i>=4;i--) {y[i]=shiftl(x[i-1],m)+k;k=hiremainder;}
y[3]=p1+k;y[2]=p2;
}
else
{
y=cgeti(lx+d);for(i=lx;i<lx+d;i++) y[i]=0;
for(i=lx-1;i>=3;i--) {y[i]=shiftl(x[i],m)+k;k=hiremainder;}
y[2]=p1+k;
}
}
else
{
y=cgeti(lx+d);for(i=lx;i<lx+d;i++) y[i]=0;
for(i=lx-1;i>=2;i--) y[i]=x[i];
}
}
else
{
n= -n;d=n>>5;m=n&31;if(lx<d+3) return gzero;
if(!m)
{
y=cgeti(lx-d);for(i=2;i<lx-d;i++) y[i]=x[i];
}
else
{
m=32-m;d++;
p1=shiftl(x[2],m);
if(hiremainder)
{
y=cgeti(lx-d+1);y[2]=hiremainder;
for(i=3;i<=lx-d;i++)
{
p2=shiftl(x[i],m);y[i]=p1+hiremainder;p1=p2;
}
}
else
{
if(lx==d+2) return gzero;
y=cgeti(lx-d);
for(i=3;i<=lx-d;i++)
{
p2=shiftl(x[i],m);y[i-1]=p1+hiremainder;p1=p2;
}
}
}
}
y[1]=y[0];setsigne(y,s);return y;
}
GEN shiftr(x,n)
GEN x;
long n;
{
long l;
GEN y;
y=rcopy(x);l=expo(x)+n;
if(l>0x7fffff||l<-0x800000) err(shier2);
setexpo(y,l);return y;
}
GEN mptrunc(x)
GEN x;
{
long e,i,s,lx=lg(x),p1,p2,m;
unsigned long d;
GEN y;
if(typ(x)==1) return icopy(x);
s=signe(x);if(!s) return gzero;
e=expo(x);if(e<0) return gzero;
d=e>>5;m=e&31;if(d>=lx-2) err(truer2);
y=cgeti(d+3);y[1]=y[0];setsigne(y,s);
if(m==31) for(i=2;i<=d+2;i++) y[i]=x[i];
else
{
m++;p1=0;
for(i=2;i<=d+2;i++)
{
p2=shiftl(x[i],m);y[i]=hiremainder+p1;p1=p2;
}
}
return y;
}
GEN mpent(x)
GEN x;
{
long e,i,lx=lg(x),m,f,p1,p2;
unsigned long d;
GEN y,z;
if(typ(x)==1) return icopy(x);
if(signe(x)>=0) return mptrunc(x);
e=expo(x);if(e<0) {y=cgeti(3);y[2]=1;y[1]=0xff000003;return y;}
d=e>>5;m=e&31;if(d>=lx-2) err(truer2);
y=cgeti(d+3);y[1]=0xff000003+d;
if(m==31)
{
for(i=2;i<=d+2;i++) y[i]=x[i];
while((i<lx)&&(!x[i])) i++;
f=(i<lx);
}
else
{
m++;p1=0;
for(i=2;i<=d+2;i++)
{
p2=shiftl(x[i],m);y[i]=hiremainder+p1;p1=p2;
}
if(p1) f=1;
else
{
while((i<lx)&&(!x[i])) i++;
f=(i<lx);
}
}
if(f)
{
for(i=d+2;(i>=2)&&(y[i]==0xffffffff);i--) y[i]=0;
if(i>=2) y[i]++;
else
{
z=y;y=cgeti(1);*y=(*z)+1;y[1]=z[1]+1;
}
}
return y;
}
int mpcmp(x,y)
GEN x,y;
{
if(typ(x)==1) return (typ(y)==1) ? cmpii(x,y) : cmpir(x,y);
return (typ(y)==1) ? -cmpir(y,x) : cmprr(x,y);
}
int cmpsi(x,y)
long x;
GEN y;
{
ulong p;
if(!x) return -signe(y);
if(x>0)
{
if(signe(y)<=0) return 1;
if(lgef(y)>3) return -1;
p=y[2];if(p==x) return 0;
return (p<(ulong)x) ? 1 : -1;
}
else
{
if(signe(y)>=0) return -1;
if(lgef(y)>3) return 1;
p=y[2];if(p== -x) return 0;
return (p<(ulong)(-x)) ? -1 : 1;
}
}
int cmpsr(x,y)
long x;
GEN y;
{
int p;
long av;
GEN z;
if(!x) return -signe(y);
av=avma;z=cgetr(3);affsr(x,z);
p=cmprr(z,y);avma=av;return p;
}
int cmpii(x,y)
GEN x,y;
{
long sx=signe(x),sy=signe(y),lx,ly,i;
if(sx<sy) return -1;
if(sx>sy) return 1;
if(!sx) return 0;
lx=lgef(x);ly=lgef(y);
if(lx>ly) return sx;
if(lx<ly) return -sx;
for(i=2;(i<lx)&&(x[i]==y[i]);i++);
if(i==lx) return 0;
return ((ulong)x[i]>(ulong)y[i]) ? sx : -sx;
}
int cmpir(x,y)
GEN x,y;
{
long av=avma;
int p;
GEN z;
if(!signe(x)) return -signe(y);
z=cgetr(lg(y));affir(x,z);
p=cmprr(z,y);avma=av;return p;
}
int cmprr(x,y)
GEN x,y;
{
long sx=signe(x),sy=signe(y),ex,ey,lx,ly,lz,i;
if(sx<sy) return -1;
if(sx>sy) return 1;
if(!sx) return 0;
ex=expo(x);ey=expo(y);
if(ex>ey) return sx;
if(ex<ey) return -sx;
lx=lg(x);ly=lg(y);lz=(lx<ly)?lx:ly;
for(i=2;(i<lz)&&(x[i]==y[i]);i++);
if(i<lz) return ((ulong)x[i]>(ulong)y[i]) ? sx : -sx;
if(lx>=ly)
{
while((i<lx)&(!x[i])) i++;
return (i==lx) ? 0 : sx;
}
else
{
while((i<ly)&(!y[i])) i++;
return (i==ly) ? 0 : -sx;
}
}
GEN mpadd(x,y)
GEN x,y;
{
if(typ(x)==1) return (typ(y)==1) ? addii(x,y) : addir(x,y);
return (typ(y)==1) ? addir(y,x) : addrr(x,y);
}
GEN addss(x,y)
long x,y;
{
long t[3];
if(!x) return stoi(y);
t[0]=0x1010003;
if(x>0) {t[1]=0x1000003;t[2]=x;} else {t[1]=0xff000003;t[2]= -x;}
return addsi(y,t);
}
GEN addsi(x,y)
long x;
GEN y;
{
long sx,sy,ly,p,i;
GEN z;
if(!x) return icopy(y);
sy=signe(y);if(!sy) return stoi(x);
if(x<0) {sx= -1;x= -x;} else sx=1;
ly=lgef(y);
if(sx==sy)
{
p=addll(x,y[ly-1]);
if(overflow)
{
z=cgeti(ly+1);z[ly]=p;
for(i=ly-1;(i>2)&&(y[i-1]==0xffffffff);i--) z[i]=0;
if(i>2)
{
z[i]=y[i-1]+1;i--;while(i>=3) {z[i]=y[i-1];i--;}
z[2]=z[1]=z[0]-1;z++;avma+=4;
}
else {z[2]=1;z[1]=z[0];}
}
else
{
z=cgeti(ly);z[ly-1]=p;for(i=1;i<ly-1;i++) z[i]=y[i];
}
setsigne(z,sx);
}
else
{
if(ly==3)
{
if((ulong)y[2]>(ulong)x)
{
z=cgeti(3);z[1]=(sy<<24)+3;z[2]=y[2]-x;return z;
}
if(y[2]==x) return gzero;
z=cgeti(3);z[1]=((-sy)<<24)+3;z[2]=x-y[2];return z;
}
p=subll(y[ly-1],x);
if(overflow)
{
z=cgeti(ly);z[ly-1]=p;
for(i=ly-2;!(y[i]);i--) z[i]=0xffffffff;
z[i]=y[i]-1;
if((i>2)||z[i]) {i--;for(;i>=1;i--) z[i]=y[i];}
else
{
z[2]=z[1]=z[0]-1;z++;avma+=4;setsigne(z,sy);
}
}
else
{
z=cgeti(ly);z[ly-1]=p;for(i=1;i<ly-1;i++) z[i]=y[i];
}
}
return z;
}
GEN addii(x,y)
GEN x,y;
{
long sx=signe(x),sy=signe(y),sz,lx=lgef(x),ly=lgef(y),i,j,p;
GEN z;
if(!sx) return icopy(y);
if(!sy) return icopy(x);
if(lx<ly) {z=x;x=y;y=z;sz=sx;sx=sy;sy=sz;sz=lx;lx=ly;ly=sz;}
if(sx==sy)
{
z=cgeti(lx+1);overflow=0;
for(i=ly-1,j=lx-1;i>=2;i--,j--) z[j+1]=addllx(x[j],y[i]);
if(overflow)
{
for(;(j>=2)&&(x[j]==0xffffffff);j--) z[j+1]=0;
if(j>=2)
{
z[j+1]=x[j]+1;j--;
for(;j>=2;j--) z[j+1]=x[j];
z[1]=z[0]-1;z[2]=x[1];z++;avma+=4;
}
else {z[2]=1;z[1]=x[1]+1;}
}
else
{
for(;j>=2;j--) z[j+1]=x[j];
z[1]=z[0]-1;z[2]=x[1];z++;avma+=4;
}
}
else
{
if(lx==ly)
{
setsigne(y,1);setsigne(x,1);p=cmpii(x,y);
setsigne(y,sy);setsigne(x,sx);if(!p) return gzero;
if(p<0) {z=x;x=y;y=z;sz=sx;sx=sy;sy=sz;}
}
z=cgeti(lx);overflow=0;
for(i=ly-1,j=lx-1;i>=2;i--,j--) z[j]=subllx(x[j],y[i]);
if(overflow)
{
for(;!(x[j]);j--) z[j]=0xffffffff;
z[j]=x[j]-1;j--;
for(;j>=2;j--) z[j]=x[j];
}
else
{
for(;j>=2;j--) z[j]=x[j];
}
if(z[2]) z[1]=x[1];
else
{
for(j=3;(j<lx)&&(!z[j]);j++);
i=j-2;z[i+1]=z[i]=z[0]-i;z+=i;avma+=(i<<2);setsigne(z,sx);
}
}
return z;
}
GEN addsr(x,y)
long x;
GEN y;
{
long p[3];
if(!x) return rcopy(y);
p[0]=0x1010003;
if(x>0) {p[1]=0x1000003;p[2]=x;} else {p[1]=0xff000003;p[2]= -x;}
return addir(p,y);
}
GEN addir(x,y)
GEN x,y;
{
long l,e,ly,av,i,l1;
GEN z;
if(!signe(x)) return rcopy(y);
if(!signe(y))
{
l=lgef(x)-(expo(y)>>5);if((l<3)||(l>32767)) err(adder3);
z=cgetr(l);affir(x,z);return z;
}
else
{
e=expo(y)-expi(x);ly=lg(y);
if(e>0)
{
l=ly-(e>>5);if(l<=2) return rcopy(y);
}
else
{
l=ly+((-e)>>5)+1;if(l>32767) err(adder3);
}
av=avma;z=cgetr(l);affir(x,z);l1=av-avma;l=l1>>2;
z=addrr(z,y);
for(i=lg(z)-1;i>=0;i--) z[i+l]=z[i];z+=l;avma+=l1;
}
return z;
}
GEN addrr(x,y)
GEN x,y;
{
long sx=signe(x),sy=signe(y),lx=lg(x),ly=lg(y),lz,ex=expo(x),ey=expo(y),sz;
long av0=avma,e,l,i,d,m,flag,lp1,lp2,av,k,j,cex,f2;
GEN z,p1,p2;
if(!sy)
{
if(!sx) {e=(ex>=ey)?ex:ey;z=cgetr(3);z[2]=0;z[1]=e+0x800000;return z;}
e=ex-ey;
if(e<=0) {z=cgetr(3);z[2]=0;z[1]=ey+0x800000;return z;}
l=(e>>5)+3;if(l>lx) l=lx;z=cgetr(l);
for(i=1;i<l;i++) z[i]=x[i];return z;
}
e=ey-ex;
if(!sx)
{
if(e<=0) {z=cgetr(3);z[2]=0;z[1]=ex+0x800000;return z;}
l=(e>>5)+3;if(l>ly) l=ly;z=cgetr(l);
for(i=1;i<l;i++) z[i]=y[i];return z;
}
if(e)
{
if(e<0) {z=x;x=y;y=z;lz=lx;lx=ly;ly=lz;ey=ex;e= -e;sz=sx;sx=sy;sy=sz;}
d=e>>5;m=e&31;
if(d>=ly-2) return rcopy(y);
l=d+lx;
if(l>=ly)
{
flag=1;p1=cgetr(ly);lp1=ly;lp2=ly-d;
}
else
{
flag=0;p1=cgetr(l+1);lp2=lx+1;lp1=l+1;
}
av=avma;
if(m)
{
p2=cgetr(lp2);m=32-m;
if(flag) {shiftl(x[lp2-1],m);k=hiremainder;}
else k=0;
for(i=lp2-1;i>=3;i--)
{
p2[i]=shiftl(x[i-1],m)+k;k=hiremainder;
}
p2[2]=k;
}
else p2=x;
}
else
{
l=(lx>ly)?ly:lx;p1=cgetr(l);av=avma;lp2=lp1=l;flag=2;p2=x;m=0;
}
if(sx==sy)
{
overflow=0;
if(m+flag) for(i=lp1-1,j=lp2-1;j>=2;i--,j--) p1[i]=addllx(p2[j],y[i]);
else
{
p1[lp1-1]=y[lp1-1];
for(i=lp1-2,j=lp2-2;j>=2;i--,j--) p1[i]=addllx(p2[j],y[i]);
}
if(overflow)
{
for(;(i>=2)&&(y[i]==0xffffffff);i--) p1[i]=0;
if(i>=2) {cex=0;p1[i]=y[i]+1;while(i>=3) {i--;p1[i]=y[i];}}
else
{
cex=1;k=0x80000000;if(ey==0x7fffff) err(adder4);
for(i=2;i<lp1;i++) {p1[i]=shiftlr(p1[i],1)+k;k=hiremainder;}
}
}
else {cex=0;for(;i>=2;i--) p1[i]=y[i];}
p1[1]=(sx<<24)+ey+cex+0x800000;
avma=av;return p1;
}
else
{
if(!e)
{
for(i=2;(i<l)&&(p2[i]==y[i]);i++);
if(i==l)
{
e=ex-((l-2)<<5)+0x800000;if(e<0) err(adder5);
if(e>=0x1000000) err(adder4);
avma=av0;z=cgetr(3);z[2]=0;z[1]=e;return z;
}
else
{
f2=(((ulong)y[i])>((ulong)p2[i]))?1:0;
}
}
else f2=1;
if(f2)
{
overflow=0;
if(m+flag) for(i=lp1-1,j=lp2-1;j>=2;i--,j--) p1[i]=subllx(y[i],p2[j]);
else
{
p1[lp1-1]=y[lp1-1];
for(i=lp1-2,j=lp2-2;j>=2;i--,j--) p1[i]=subllx(y[i],p2[j]);
}
if(overflow)
{
for(;(i>=2)&&(!y[i]);i--) p1[i]=0xffffffff;
p1[i]=y[i]-1;while(i>=3) {i--;p1[i]=y[i];}
}
else for(;i>=2;i--) p1[i]=y[i];
}
else
{
overflow=0;
if(m+flag) for(i=lp1-1;i>=2;i--) p1[i]=subllx(p2[i],y[i]);
else
{
p1[lp1-1]=subllx(0,y[lp1-1]);
for(i=lp1-2;i>=2;i--) p1[i]=subllx(p2[i],y[i]);
}
}
for(i=2;!p1[i];i++);j=i-2;avma=av+(j<<2);p1[j]=p1[0]-j;p1+=j;
m=bfffo(p1[2]);e=ey-(j<<5)-m+0x800000;
if(e<0) err(adder5);
p1[1]=f2 ? (sy<<24)+e : (sx<<24)+e;
if(m)
{
k=0;for(i=lp1-1-j;i>=2;i--) {p1[i]=shiftl(p1[i],m)+k;k=hiremainder;}
}
return p1;
}
}
GEN mpsub(x,y)
GEN x,y;
{
if(typ(x)==1) return (typ(y)==1) ? subii(x,y) : subir(x,y);
return (typ(y)==1) ? subri(x,y) : subrr(x,y);
}
GEN subii(x,y)
GEN x,y;
{
long s=signe(y);
GEN z;
if(x==y) return gzero;
setsigne(y,-s);z=addii(x,y);setsigne(y,s);
return z;
}
GEN subrr(x,y)
GEN x,y;
{
long s=signe(y);
GEN z;
if(x==y)
{
z=cgetr(3);z[2]=0;z[1]=0x800000-(lg(x)<<5);return z;
}
setsigne(y,-s);z=addrr(x,y);setsigne(y,s);return z;
}
GEN subsi(x,y)
long x;
GEN y;
{
long s=signe(y);
GEN z;
setsigne(y,-s);z=addsi(x,y);setsigne(y,s);return z;
}
GEN subsr(x,y)
long x;
GEN y;
{
long s=signe(y);
GEN z;
setsigne(y,-s);z=addsr(x,y);setsigne(y,s);return z;
}
GEN subss(x,y)
long x,y;
{
return addss(-y,x);
}
GEN subir(x,y)
GEN x,y;
{
long s=signe(y);
GEN z;
setsigne(y,-s);z=addir(x,y);setsigne(y,s);return z;
}
GEN subri(x,y)
GEN x,y;
{
long s=signe(y);
GEN z;
setsigne(y,-s);z=addir(y,x);setsigne(y,s);return z;
}
GEN mpmul(x,y)
GEN x,y;
{
if(typ(x)==1) return (typ(y)==1) ? mulii(x,y) : mulir(x,y);
return (typ(y)==1) ? mulir(y,x) : mulrr(x,y);
}
GEN mulss(x,y)
long x,y;
{
long s,p1;
GEN z;
if((!x)||(!y)) return gzero;
s=1;if(x<0) {s= -1;x= -x;} if(y<0) {s= -s;y= -y;}
p1=mulll(x,y);
if(hiremainder) {z=cgeti(4);z[2]=hiremainder;z[3]=p1;}
else {z=cgeti(3);z[2]=p1;}
z[1]=z[0];setsigne(z,s);return z;
}
GEN mulsr(x,y)
long x;
GEN y;
{
long lx,i,k,s,p1,p2,e;
GEN z;
if(!x) return gzero;
s=signe(y);if(x<0) {s= -s;x= -x;}
if(!s)
{
p1=bfffo(x);e=y[1]+31-p1;if(e>=0x1000000) err(muler2);
z=cgetr(3);z[1]=e;z[2]=0;
}
else
{
if(x==1) {z=rcopy(y);setsigne(z,s);return z;}
lx=lg(y);z=cgetr(lx);setsigne(z,s);
p2=mulll(x,y[lx-1]);
for(i=lx-2;i>=2;i--) z[i+1]=addmul(x,y[i]);
z[2]=hiremainder;p1=bfffo(hiremainder);
if(p1)
{
shiftl(p2,p1);k=hiremainder;
for(i=lx-1;i>=2;i--)
{
z[i]=shiftl(z[i],p1)+k;k=hiremainder;
}
}
e=32-p1+expo(y);if(e>=0x800000) err(muler2);
setexpo(z,e);
}
return z;
}
GEN mulii(x,y)
GEN x,y;
{
long i,j,lx=lgef(x),ly=lgef(y),sx,sy,lz,p1,p2;
GEN z;
sx=signe(x);if(!sx) return gzero;
sy=signe(y);if(!sy) return gzero;
if(sy<0) sx= -sx;
if(lx>ly) {z=x;x=y;y=z;lz=lx;lx=ly;ly=lz;}
lz=lx+ly-2;if(lz>=0x10000) err(muler1);
z=cgeti(lz);z[1]=z[0];setsigne(z,sx);
p1=x[lx-1];hiremainder=0;
for(i=ly-1;i>=2;i--) z[lx+i-2]=addmul(p1,y[i]);
z[lx-1]=hiremainder;
for(j=lx-2;j>=2;j--)
{
p1=x[j];hiremainder=0;
for(i=ly-1;i>=2;i--)
{
p2=addmul(p1,y[i]);
z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
}
z[j]=hiremainder;
}
if(!(z[2]))
{
z[2]=z[1]-1;z[1]=z[0]-1;z++;avma+=4;
}
return z;
}
GEN mulrr(x,y)
GEN x,y;
{
long i,j,lx=lg(x),ly=lg(y),sx=signe(x),sy=signe(y),ex=expo(x),ey=expo(y);
long e,flag,garde,p1,p2,lz;
GEN z;
e=ex+ey+0x800000;if(e>=0xffffff) err(muler4);
if(e<0) err(muler5);
if((!sx)||(!sy)) {z=cgetr(3);z[2]=0;z[1]=e;return z;}
if(sy<0) sx= -sx;
if(lx>ly) {lz=ly;z=x;x=y;y=z;flag=1;} else {lz=lx;flag=(lx!=ly);}
z=cgetr(lz);z[1]=(sx<<24)+e;
if(flag) mulll(x[2],y[lz]);else hiremainder=0;
if(lz==3)
{
garde=flag ? addmul(x[2],y[2]) : mulll(x[2],y[2]);
if((long)hiremainder<0) {z[2]=hiremainder;z[1]++;}
else {z[2]=(garde<0)?(hiremainder<<1)+1:(hiremainder<<1);}
return z;
}
p1=x[lz-1];garde=hiremainder;
if(p1)
{
mulll(p1,y[3]);p2=addmul(p1,y[2]);
garde=addll(p2,garde);z[lz-1]=overflow+hiremainder;
}
else z[lz-1]=0;
for(j=lz-2;j>=3;j--)
{
p1=x[j];
if(p1)
{
mulll(p1,y[lz+2-j]);
p2=addmul(p1,y[lz+1-j]);
garde=addll(p2,garde);hiremainder+=overflow;
for(i=lz-j;i>=2;i--)
{
p2=addmul(p1,y[i]);
z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
}
z[j]=hiremainder;
}
else z[j]=0;
}
p1=x[2];p2=mulll(p1,y[lz-1]);
garde=addll(p2,garde);hiremainder+=overflow;
for(i=lz-2;i>=2;i--)
{
p2=addmul(p1,y[i]);
z[i+1]=addll(p2,z[i+1]);hiremainder+=overflow;
}
z[2]=hiremainder;
if((long)hiremainder>0)
{
overflow=(garde<0)?1:0;
for(i=lz-1;i>=2;i--) {p1=z[i];z[i]=addllx(p1,p1);}
}
else z[1]++;
return z;
}
GEN mulir(x,y)
GEN x,y;
{
long sx=signe(x),sy,av,lz,ey,e,garde,p1,p2,i,j;
GEN z,temp;
if(!sx) return gzero;
sy=signe(y);ey=expo(y);
if(!sy)
{
z=cgetr(3);z[2]=0;e=expi(x)+ey+0x800000;if(e>=0x1000000) err(muler6);
z[1]=e;return z;
}
lz=lg(y);if(sy<0) sx= -sx;
z=cgetr(lz);setsigne(z,sx);av=avma;
temp=cgetr(lz+1);affir(x,temp);x=y;y=temp;
e=expo(y)+ey+0x800000;if(e>=0xffffff) err(muler4);
if(e<0) err(muler5);
z[1]=(sx<<24)+e;
mulll(x[2],y[lz]);
if(lz==3)
{
garde=addmul(x[2],y[2]);
if((long)hiremainder<0) {z[2]=hiremainder;z[1]++;}
else {z[2]=(garde<0)?(hiremainder<<1)+1:(hiremainder<<1);}
avma=av;return z;
}
garde=hiremainder;
p1=x[lz-1];mulll(p1,y[3]);p2=addmul(p1,y[2]);
garde=addll(p2,garde);z[lz-1]=overflow+hiremainder;
for(j=lz-2;j>=3;j--)
{
p1=x[j];mulll(p1,y[lz+2-j]);
p2=addmul(p1,y[lz+1-j]);
garde=addll(p2,garde);hiremainder+=overflow;
for(i=lz-j;i>=2;i--)
{
p2=addmul(p1,y[i]);
z[i+j-1]=addll(p2,z[i+j-1]);hiremainder+=overflow;
}
z[j]=hiremainder;
}
p1=x[2];p2=mulll(p1,y[lz-1]);
garde=addll(p2,garde);hiremainder+=overflow;
for(i=lz-2;i>=2;i--)
{
p2=addmul(p1,y[i]);
z[i+1]=addll(p2,z[i+1]);hiremainder+=overflow;
}
z[2]=hiremainder;
if((long)hiremainder>0)
{
overflow=(garde<0)?1:0;
for(i=lz-1;i>=2;i--) {p1=z[i];z[i]=addllx(p1,p1);}
}
else z[1]++;
avma=av;return z;
}
GEN convi(x)
GEN x;
{
long lx,av=avma,lz;
GEN z,p1,p2;
if(!signe(x))
{
z=cgeti(3);z[1]= -1;z[2]=0;avma=av;return z+3;
}
p1=absi(x);lx=lgef(p1);lz=((lx-2)*15)/14+3;z=cgeti(lz);z[1]= -1;
for(p2=z+2;signe(p1);p2++) *p2=divisii(p1,1000000000,p1);
avma=av;return p2;
}
GEN confrac(x)
GEN x;
{
long lx=lg(x),ex= -expo(x)-1,ex1,av=avma,ly,ey;
long lr,nbdec,k,i,j;
GEN y,res;
ey=((lx-2)<<5)+ex;ly=(ey+63)>>5;y=cgeti(ly);ex1=ex>>5; /* 95 dans mp.s faux? */
for(i=0;i<ex1;i++) y[i]=0;
ex&=31;
if(!ex) for(j=2;j<lx;j++) y[i++]=x[j];
else
{
k=0;
for(j=2;j<lx;j++) {y[i++]=shiftlr(x[j],ex)+k;k=hiremainder;}
y[ly-2]=k;
}
y[ly-1]=0;
nbdec=ey*0.30103+1;lr=(nbdec+17)/9;res=cgeti(lr);
*res=nbdec;
for(j=1;j<lr;j++)
{
hiremainder=0;
for(i=ly-1;i>=0;i--) y[i]=addmul(y[i],1000000000);
res[j]=hiremainder;
}
avma=av;return res;
}
void mulsii(x,y,z)
long x;
GEN y,z;
{
long av=avma;
GEN p1;
p1=mulsi(x,y);affii(p1,z);avma=av;
}
void addsii(x,y,z)
long x;
GEN y,z;
{
long av=avma;
GEN p1;
p1=addsi(x,y);affii(p1,z);avma=av;
}
long divisii(x,y,z)
long y;
GEN x,z;
{
long av=avma,k;
GEN p1;
p1=divis(x,y);affii(p1,z);avma=av;
k=hiremainder;return k;
}
long vals(x)
long x;
{
unsigned short int y,z;
int s;
if(!x) return -1;
y=x;if(!y) {s=16;y=((ulong)x)>>16;} else s=0;
z=y&255;if(!z) {s+=8;z=y>>8;}
y=z&15;if(!y) {s+=4;y=z>>4;}
z=y&3;if(!z) {s+=2;z=y>>2;}
return (z&1) ? s : s+1;
}
long vali(x)
GEN x;
{
long i,lx=lgef(x);
if(!signe(x)) return -1;
for(i=lx-1;(i>=2)&&(!x[i]);i--);
return ((lx-1-i)<<5)+vals(x[i]);
}
GEN mpdiv(x,y)
GEN x,y;
{
if(typ(x)==1) return (typ(y)==1) ? divii(x,y) : divir(x,y);
return (typ(y)==1) ? divri(x,y) : divrr(x,y);
}
GEN divss(x,y)
long x,y;
{
long p1;
if(!y) err(diver1);
hiremainder=0;p1=divll((ulong)abs(x),(ulong)abs(y));
if(y<0) {hiremainder= -((long)hiremainder);p1= -p1;}
if(x<0) p1= -p1;
return stoi(p1);
}
GEN modss(x,y)
long x,y;
{
long y1;
if(!y) err(moder1);
hiremainder=0;divll(abs(x),y1=abs(y));
if(!hiremainder) return gzero;
return (((long)hiremainder)<0) ? stoi(y1-hiremainder) : stoi(hiremainder);
}
GEN resss(x,y)
long x,y;
{
if(!y) err(reser1);
hiremainder=0;divll(abs(x),abs(y));
return (y<0) ? stoi(-((long)hiremainder)) : stoi(hiremainder);
}
GEN dvmdss(x,y,z)
long x,y;
GEN *z;
{
GEN p1;
p1=divss(x,y);*z=stoi(hiremainder);
return p1;
}
void dvmdssz(x,y,z,t)
long x,y;
GEN z,t;
{
long av=avma;
GEN p1;
p1=divss(x,y);affsi(hiremainder,t);
mpaff(p1,z);avma=av;
}
GEN dvmdsi(x,y,z)
long x;
GEN y,*z;
{
GEN p1;
p1=divsi(x,y);*z=stoi(hiremainder);
return p1;
}
void dvmdsiz(x,y,z,t)
long x;
GEN t,y,z;
{
long av=avma;
GEN p1;
p1=divsi(x,y);affsi(hiremainder,t);
mpaff(p1,z);avma=av;
}
GEN dvmdis(x,y,z)
long y;
GEN x,*z;
{
GEN p1;
p1=divis(x,y);*z=stoi(hiremainder);
return p1;
}
void dvmdisz(x,y,z,t)
long y;
GEN x,t,z;
{
long av=avma;
GEN p1;
p1=divis(x,y);affsi(hiremainder,t);
mpaff(p1,z);avma=av;
}
void dvmdiiz(x,y,z,t)
GEN x,y,z,t;
{
long av=avma;
GEN p1,p2;
p1=dvmdii(x,y,&p2);mpaff(p1,z);mpaff(p2,t);
avma=av;
}
GEN divsi(x,y)
long x;
GEN y;
{
long s=signe(y),ly=lgef(y),p1;
if(!s) err(diver2);
if((!x)||(ly>3)||(y[2]<0)) {hiremainder=x;return gzero;}
hiremainder=0;p1=divll(abs(x),y[2]);
if(signe(y)<0) {hiremainder= -((long)hiremainder);p1= -p1;}
if(x<0) p1= -p1;
return stoi(p1);
}
GEN ressi(x,y)
long x;
GEN y;
{
divsi(x,y);return stoi(hiremainder);
}
GEN modsi(x,y)
long x;
GEN y;
{
long s;
GEN p1;
divsi(x,y);
if(!hiremainder) return gzero;
if(x>0) return stoi(hiremainder);
else
{
s=signe(y);setsigne(y,1);p1=addsi(hiremainder,y);
setsigne(y,s);return p1;
}
}
GEN divis(y,x)
long x;
GEN y;
{
long s=signe(y),ly=lgef(y),i,d;
GEN z;
if(!x) err(diver4);
if(!s) {hiremainder=0;return gzero;}
if(x<0) {s= -s;x= -x;}
if((ulong)x>(ulong)y[2])
{
if(ly==3) {hiremainder=itos(y);return gzero;}
else {z=cgeti(ly-1);d=1;hiremainder=y[2];}
}
else {z=cgeti(ly);d=0;hiremainder=0;}
for(i=d+2;i<ly;i++) z[i-d]=divll(y[i],x);
z[1]=z[0];setsigne(z,s);if(s<0) hiremainder= -((long)hiremainder);
return z;
}
GEN modis(x,y)
long y;
GEN x;
{
divis(x,y);if(!hiremainder) return gzero;
return (signe(x)>0) ? stoi(hiremainder) : stoi(abs(y)+hiremainder);
}
GEN resis(x,y)
long y;
GEN x;
{
divis(x,y);return stoi(hiremainder);
}
void divisz(x,y,z)
long y;
GEN x,z;
{
long av=avma;
GEN p1;
if(typ(z)==1) gops2gsz(divis,x,y,z);
else
{
p1=cgetr(lg(z));affir(x,p1);p1=divrs(p1,y);
affrr(p1,z);avma=av;
}
}
void divsiz(x,y,z)
long x;
GEN y,z;
{
long av=avma,lz;
GEN p1,p2;
if(typ(z)==1) gops2sgz(divsi,x,y,z);
else
{
lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affsr(x,p1);affir(y,p2);
p1=divrr(p1,p2);affrr(p1,z);avma=av;
}
}
void divssz(x,y,z)
long x,y;
GEN z;
{
long av=avma;
GEN p1;
if(typ(z)==1) gops2ssz(divss,x,y,z);
else
{
p1=cgetr(lg(z));affsr(x,p1);p1=divrs(p1,y);
affrr(p1,z);avma=av;
}
}
GEN divir(x,y)
GEN x,y;
{
GEN xr,z;
long av,ly;
if(!signe(y)) err(diver5);
if(!signe(x)) return gzero;
ly=lg(y);z=cgetr(ly);av=avma;affir(x,xr=cgetr(ly+1));
xr=divrr(xr,y);affrr(xr,z);avma=av;return z;
}
GEN divri(x,y)
GEN x,y;
{
GEN yr,z;
long av,lx,ex,s=signe(y);
if(!s) err(diver8);
if(!signe(x))
{
ex=expo(x)-expi(y)+0x800000;
if(ex<0) err(diver12);
z=cgetr(3);z[1]=ex;z[2]=0;return z;
}
if((lg(y)==3)&&(y[2]>0)) return (s>0) ? divrs(x,y[2]) : divrs(x,-y[2]);
lx=lg(x);z=cgetr(lx);av=avma;affir(y,yr=cgetr(lx+1));
yr=divrr(x,yr);affrr(yr,z);avma=av;return z;
}
void diviiz(x,y,z)
GEN x,y,z;
{
long av=avma,lz;
GEN p1,p2;
if(typ(z)==1) {p1=divii(x,y);affii(p1,z);avma=av;}
else
{
lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affir(x,p1);affir(y,p2);
p1=divrr(p1,p2);affrr(p1,z);avma=av;
}
}
void divrrz(x,y,z)
GEN x,y,z;
{
long av=avma;
GEN p1;
p1=divrr(x,y);mpaff(p1,z);avma=av;
}
void mpdivz(x,y,z)
GEN x,y,z;
{
long av=avma,lz;
GEN p1,p2;
if(typ(z)==1)
{
if(typ(x)==2||typ(y)==2) err(divzer1);
p1=divii(x,y);affii(p1,z);avma=av;
}
else
{
if(typ(x)==1)
{
if(typ(y)==2) {p1=divir(x,y);mpaff(p1,z);avma=av;}
else
{
lz=lg(z);p1=cgetr(lz);p2=cgetr(lz);affir(x,p1);affir(y,p2);
p1=divrr(p1,p2);affrr(p1,z);avma=av;
}
}
else
{
if(typ(y)==2) {p1=divrr(x,y);affrr(p1,z);avma=av;}
else {p1=divri(x,y);affrr(p1,z);avma=av;}
}
}
}
GEN divsr(x,y)
long x;
GEN y;
{
long av,ly;
GEN p1,z;
if(!signe(y)) err(diver3);
if(!x) return gzero;
ly=lg(y);z=cgetr(ly);av=avma;p1=cgetr(ly+1);affsr(x,p1);p1=divrr(p1,y);
affrr(p1,z);avma=av;return z;
}
GEN modii(x,y)
GEN x,y;
{
long av=avma,tetpil;
GEN p1;
p1=dvmdii(x,y,-1);
if(signe(p1)>=0) return p1;
tetpil=avma;p1=(signe(y)>0) ? addii(p1,y) : subii(p1,y);
return gerepile(av,tetpil,p1);
}
void modiiz(x,y,z)
GEN x,y,z;
{
long av=avma;
GEN p1;
p1=modii(x,y);affii(p1,z);avma=av;
}
void resiiz(x,y,z)
GEN x,y,z;
{
long av=avma;
GEN p1;
p1=resii(x,y);affii(p1,z);avma=av;
}
GEN divrs(x,y)
long y;
GEN x;
{
long i,k,lx,ex,garde,sh,s=signe(x);
GEN z;
if(!y) err(diver6);
if(!s)
{
z=cgetr(3);z[2]=0;z[1]=x[1]-31+bfffo(y);
if(z[1]<0) err(diver7);return z;
}
if(y<0) {s= -s;y= -y;}
if(y==1) {z=rcopy(x);setsigne(z,s);return z;}
z=cgetr(lx=lg(x));setsigne(z,s);hiremainder=0;
for(i=2;i<lx;i++) z[i]=divll(x[i],y);
garde=divll(0,y);sh=bfffo(z[2]);ex=expo(x)-sh;if((-ex)>0x800000) err(diver7);
setexpo(z,ex);shiftl(garde,sh);k=hiremainder;
for(i=lx-1;i>=2;i--) {z[i]=shiftl(z[i],sh)+k;k=hiremainder;}
return z;
}
mpdivis(x,y,z)
GEN x,y,z;
{
long av=avma;
GEN p1,p2;
p1=dvmdii(x,y,&p2);
if(signe(p2)) {avma=av;return 0;}
affii(p1,z);avma=av;return 1;
}
divise(x,y)
GEN x,y;
{
long av=avma;
GEN p1;
p1=dvmdii(x,y,-1);avma=av;
return signe(p1) ? 0 : 1;
}
GEN dvmdii(x,y,z)
GEN x,y,*z;
{
long av,av2,lx,ly,lz,i,j,dec,sh,k,k1,sx=signe(x),sy=signe(y);
long saux,k3,k4,av1,flk4;
ulong si,qp;
GEN p1,p2,p3,p4;
if(!sy) err(dvmer1);
if(!sx)
{
if(((long)z==0xffffffff)||((long)z==0)) return gzero;
*z=gzero;return gzero;
}
lx=lgef(x);ly=lgef(y);lz=lx-ly;
if(lz<0)
{
if((long)z==0xffffffff) return icopy(x);
if(z==0) return gzero;
*z=icopy(x);return gzero;
}
av=avma;if(sx<0) sy= -sy;
if(ly==3)
{
si=y[2];
if(si>(ulong)x[2]) {p1=cgeti(lx-1);hiremainder=x[2];dec=1;}
else {p1=cgeti(lx);hiremainder=0;dec=0;}
for(i=2+dec;i<lx;i++) p1[i-dec]=divll(x[i],si);
if((long)z==0xffffffff)
{
avma=av;if(!hiremainder) return gzero;
p2=cgeti(3);p2[1]=(sx<<24)+3;p2[2]=hiremainder;return p2;
}
if(lx!=(dec+2)) {p1[1]=p1[0];setsigne(p1,sy);} else {avma=av;p1=gzero;}
if(z==0) return p1;
if(!hiremainder) *z=gzero;
else {p2=cgeti(3);p2[1]=(sx<<24)+3;p2[2]=hiremainder;*z=p2;}
return p1;
}
else
{
p1=cgeti(lx);
sh=bfffo(y[2]);
if(sh)
{
p2=cgeti(ly);k=shiftl(y[2],sh);
for(i=3;i<ly;i++)
{
k1=shiftl(y[i],sh);p2[i-1]=k+hiremainder;k=k1;
}
p2[ly-1]=k;k=0;
for(i=2;i<lx;i++)
{
k1=shiftl(x[i],sh);p1[i-1]=k+hiremainder;k=k1;
}
p1[lx-1]=k;
}
else {p1[1]=0;for(j=2;j<lx;j++) p1[j]=x[j];p2=y;}
si=p2[2];saux=p2[3];
for(i=1;i<=lz+1;i++)
{
if(p1[i]==si)
{
qp=0xffffffff;k=addll(si,p1[i+1]);
}
else
{
hiremainder=p1[i];qp=divll(p1[i+1],si);
overflow=0;k=hiremainder;
}
if(!overflow)
{
k1=mulll(qp,saux);k3=subll(k1,p1[i+2]);k+=overflow;
flk4=((ulong)hiremainder>(ulong)k);k4=subll(hiremainder,k);
while(flk4) {qp--;k3=subll(k3,saux);k4-=overflow;flk4=((ulong)k4>(ulong)si);k4=subll(k4,si);}
}
hiremainder=0;
for(j=ly-1;j>=2;j--)
{
k1=addmul(qp,p2[j]);
p1[i+j-1]=subll(p1[i+j-1],k1);hiremainder+=overflow;
}
if((ulong)p1[i]<(ulong)hiremainder)
{
overflow=0;qp--;
for(j=ly-1;j>=2;j--) p1[i+j-1]=addllx(p1[i+j-1],p2[j]);
}
p1[i]=qp;
}
av1=avma;
if((long)z!=0xffffffff)
{
if(p1[1])
{
p3=cgeti(lz+3);for(j=2;j<=lz+2;j++) p3[j]=p1[j-1];
}
else
{
p3=cgeti(lz+2);
if(!lz) sy=0;else for(j=2;j<=lz+1;j++) p3[j]=p1[j];
}
if(lg(p3)<3) p3[1]=2;else {p3[1]=p3[0];setsigne(p3,sy);}
}
if(z!=0)
{
for(j=lz+2;(j<lx)&&(!p1[j]);j++);
if(j==lx) p4=gzero;
else
{
p4=cgeti(lx-j+2);p4[1]=p4[0];
if(!sh) for(i=2;j<lx;j++,i++) p4[i]=p1[j];
else
{
hiremainder=0;k1=shiftlr(p1[j++],sh);k=hiremainder;
if(k1) {p4[2]=k1;dec=1;} else {p4[1]=p4[0]-1;p4++;avma+=4;p4[1]=p4[0];dec=0;}
for(i=2+dec;j<lx;j++,i++)
{
p4[i]=shiftlr(p1[j],sh)+k;k=hiremainder;
}
}
setsigne(p4,sx);
}
}
if((long)z==0xffffffff) return gerepile(av,av1,p4);
if((long)z==0) return gerepile(av,av1,p3);
av2=avma;dec=lpile(av,av1,0)>>2;*z=adecaler(p4,av1,av2)?p4+dec:p4;
return adecaler(p3,av1,av2)?p3+dec:p3;
}
}
GEN divrr(x,y)
GEN x,y;
{
long sx=signe(x),sy=signe(y),lx,ly,lz,ex,ex1,i,z0;
long ldif,y0,y1,si,saux,qp,k,k1,k3,k4,j,flk4;
GEN z;
if(!sy) err(diver9);
ex=expo(x)-expo(y)+0x800000;
if(ex<=0) err(diver10);
if(ex>=0x1000000) err(diver11);
if(!sx)
{
z=cgetr(3);z[1]=ex;z[2]=0;return z;
}
lx=lg(x);ly=lg(y);lz=(lx<=ly)?lx:ly;
z=cgetr(lz);if(sy<0) sx= -sx;
ex1=(sx<<24)+ex;
if(ly==3)
{
i=x[2];si=(lx>3)?x[3]:0;
if((ulong)i<(ulong)y[2])
{
hiremainder=i;z[2]=divll(si,y[2]);
z[1]=ex1-1;return z;
}
else
{
hiremainder=((ulong)i)>>1;
z[2]=(i&1)?divll((((ulong)si)>>1)|(0x80000000),y[2]):divll(((ulong)si)>>1,y[2]);
z[1]=ex1;return z;
}
}
z0= *z;*z=0;
for(i=2;i<=lz-1;i++) z[i-1]=x[i];
z[lz-1]=(lx>lz) ? x[lz] : 0;
ldif=ly-lz;if(!ldif) {y0=y[lz];y[lz]=0;}
if(ldif<=1) {y1=y[lz+1];y[lz+1]=0;}
si=y[2];saux=y[3];
for(i=0;i<lz-1;i++)
{
if(z[i]==si)
{
qp=0xffffffff;k=addll(si,z[i+1]);
}
else
{
hiremainder=z[i];qp=divll(z[i+1],si);
overflow=0;k=hiremainder;
}
if(!overflow)
{
k1=mulll(qp,saux);k3=subll(k1,z[i+2]);k+=overflow;
flk4=((ulong)hiremainder>(ulong)k);k4=subll(hiremainder,k);
while(flk4) {qp--;k3=subll(k3,saux);k4-=overflow;flk4=((ulong)k4>(ulong)si);k4=subll(k4,si);}
}
mulll(qp,y[lz+1-i]);
for(j=lz-i;j>=2;j--)
{
k1=addmul(qp,y[j]);
z[i+j-1]=subll(z[i+j-1],k1);hiremainder+=overflow;
}
if((ulong)z[i]<(ulong)hiremainder)
{
overflow=0;qp--;
for(j=lz-i;j>=2;j--) z[i+j-1]=addllx(z[i+j-1],y[j]);
}
z[i]=qp;
}
if(!ldif) y[lz]=y0;if(ldif<=1) y[lz+1]=y1;
for(j=lz-1;j>=2;j--) z[j]=z[j-1];
if(*z)
{
k=0x80000000;
for(j=2;j<lz;j++) {z[j]=shiftlr(z[j],1)+k;k=hiremainder;}
}
else ex1--;
z[1]=ex1;*z=z0;return z;
}
GEN gerepile(l,p,q)
GEN l,p,q;
{
long av,declg,tl;
GEN ll,pp,l1,l2,l3;
declg=(long)l-(long)p;if(declg<=0) return q;
for(ll=l,pp=p;pp>(GEN)avma;) *--ll= *--pp;
av=(long)ll;
while((ll<l)||((ll==l)&&(long)q))
{
l2=ll+lontyp[tl=typ(ll)];
if(tl==10) {l3=ll+lgef(ll);ll+=lg(ll);if(l3>ll) l3=l2;}
else {ll+=lg(ll);l3=ll;}
for(;l2<l3;l2++)
{
l1=(GEN)(*l2);
if((l1<l)&&(l1>=(GEN)avma))
{
if(l1<p) *l2+=declg;
else
if(ll<=l) err(gerper);
}
}
}
if((!((long)q))||((q<p)&&(q>=(GEN)avma)))
{
avma=av;return q+(declg>>2);
}
else {avma=av;return q;}
}
void cgiv(x)
GEN x;
{
long p;
if((p=pere(x))==255) return;
if((x!=(GEN)avma)||(p>1)) {setpere(x,p-1);return;}
do x+=lg(x);while(!pere(x));
avma=(long)x;
return;
}